home *** CD-ROM | disk | FTP | other *** search
- """A CallTip window class for Tkinter/IDLE.
-
- After ToolTip.py, which uses ideas gleaned from PySol
- Used by the CallTips IDLE extension.
-
- """
- from Tkinter import *
-
- class CallTip:
-
- def __init__(self, widget):
- self.widget = widget
- self.tipwindow = None
- self.id = None
- self.x = self.y = 0
-
- def showtip(self, text):
- " Display text in calltip window"
- # truncate overly long calltip
- if len(text) >= 79:
- text = text[:75] + ' ...'
- self.text = text
- if self.tipwindow or not self.text:
- return
- self.widget.see("insert")
- x, y, cx, cy = self.widget.bbox("insert")
- x = x + self.widget.winfo_rootx() + 2
- y = y + cy + self.widget.winfo_rooty()
- self.tipwindow = tw = Toplevel(self.widget)
- # XXX 12 Dec 2002 KBK The following command has two effects: It removes
- # the calltip window border (good) but also causes (at least on
- # Linux) the calltip to show as a top level window, burning through
- # any other window dragged over it. Also, shows on all viewports!
- tw.wm_overrideredirect(1)
- tw.wm_geometry("+%d+%d" % (x, y))
- try:
- # This command is only needed and available on Tk >= 8.4.0 for OSX
- # Without it, call tips intrude on the typing process by grabbing
- # the focus.
- tw.tk.call("::tk::unsupported::MacWindowStyle", "style", tw._w,
- "help", "noActivates")
- except TclError:
- pass
- label = Label(tw, text=self.text, justify=LEFT,
- background="#ffffe0", relief=SOLID, borderwidth=1,
- font = self.widget['font'])
- label.pack()
-
- def hidetip(self):
- tw = self.tipwindow
- self.tipwindow = None
- if tw:
- tw.destroy()
-
-
- ###############################
- #
- # Test Code
- #
- class container: # Conceptually an editor_window
- def __init__(self):
- root = Tk()
- text = self.text = Text(root)
- text.pack(side=LEFT, fill=BOTH, expand=1)
- text.insert("insert", "string.split")
- root.update()
- self.calltip = CallTip(text)
-
- text.event_add("<<calltip-show>>", "(")
- text.event_add("<<calltip-hide>>", ")")
- text.bind("<<calltip-show>>", self.calltip_show)
- text.bind("<<calltip-hide>>", self.calltip_hide)
-
- text.focus_set()
- root.mainloop()
-
- def calltip_show(self, event):
- self.calltip.showtip("Hello world")
-
- def calltip_hide(self, event):
- self.calltip.hidetip()
-
- def main():
- # Test code
- c=container()
-
- if __name__=='__main__':
- main()
-